package com.easylinkin.linkappapi.lobar.mapper;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easylinkin.linkappapi.lobar.dto.UserClockDTO;
import com.easylinkin.linkappapi.lobar.dto.UserGateDTO;
import com.easylinkin.linkappapi.lobar.dto.UserProjectDTO;
import com.easylinkin.linkappapi.lobar.dto.UserRecordDTO;
import com.easylinkin.linkappapi.lobar.dto.app.AppUserGateDTO;
import com.easylinkin.linkappapi.lobar.dto.app.LobarUserDTO;
import com.easylinkin.linkappapi.lobar.entity.UserProject;
import com.easylinkin.linkappapi.lobar.entity.UserRecord;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.easylinkin.linkappapi.shigongyun.vo.LaborAttendanceVo;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 * 用户考勤表 Mapper 接口
 * </p>
 *
 * @author kanyuanfeng
 * @since 2022-04-13
 */
public interface UserRecordMapper extends BaseMapper<UserRecord> {

  //查询人员考勤数据
  List<UserRecord> selectAll(@Param("tenantId") String tenantId,@Param("time")Date time);

  /**
   * 查询个人月考勤记录
   */
  List<UserRecord> getUserMouth(@Param("tenantId") String tenantId, @Param("userId") String userId, @Param("mouth") String mouth);

  List<AppUserGateDTO> findCompanyToDay(@Param("tenantId") String tenantId, @Param("startTime") Date startTime,@Param("endTime") Date endTime);

  List<AppUserGateDTO> findGroupToDay(UserRecordDTO userRecordDTO);

  List<UserRecordDTO> findUser(UserRecordDTO userRecordDTO);

  List<AppUserGateDTO> findCompanyTime(@Param("tenantId") String tenantId, @Param("startTime") Date startTime,@Param("endTime") Date endTime);

  List<AppUserGateDTO> findGroupTime(UserRecordDTO userRecordDTO);

  List<UserRecordDTO> findUserToday(UserRecordDTO userRecordDTO);

  /**
   * 劳务出勤按月分组统计数量
   *
   * @param laborAttendanceVo 入参vo
   * @return 按月分组统计数量list
   */
  List<Map<String, Object>> countGroupByMonth(LaborAttendanceVo laborAttendanceVo);

  /**
   * 劳务出勤数量统计
   *
   * @param laborAttendanceVo 条件vo
   * @return 劳务出勤数量
   */
  Integer countNumByParam(LaborAttendanceVo laborAttendanceVo);

  /**
   * 查询30天包含今天的考勤数据
   * @param tenantId
   * @return
   */
  List<LobarUserDTO> analysisMonth(String tenantId);

  List<UserProject> countWorkTypeToDay(@Param("workTypeName") String workTypeName,@Param("tenantId") String tenantId);

  //非当天出勤和在场
  List<UserProjectDTO> selectByTenantId(UserProjectDTO queryParams);

  /**
   * 企业级查询
   * @param userProjectDTO
   * @return
   */
  List<UserRecord> countAllByEnterprise(UserProjectDTO userProjectDTO);

  List<UserRecord> findAllMoth(UserClockDTO clockDTO);

  /**
   * 企业级统计
   * @param userProjectDTO
   * @return
   */
  List<UserRecordDTO> countByProject(UserProjectDTO userProjectDTO);

  List<UserProject> countEnWorkTypeToDay(@Param("tenantId") String tenantId);


  /**
   * 道闸查询在场人数
   * @param tenantId
   * @param buildTypes
   * @return
   */
  List<UserRecord> getOnAreaToDay(@Param("tenantId") String tenantId, @Param("buildTypes") List<String> buildTypes);

  List<UserRecord> findSevenAttendance(String tenantId);

  /**
   * 岗亭大屏使用 不过滤缺勤
   * @param tenantId
   * @return
   */
  List<UserRecordDTO> getByToday(String tenantId);

  //判断需不需要插入 防止高并发
  void checkAndInsert(UserRecord userRecord);

  /**
   * 查询月工时
   * @param clockDTO
   * @return
   */
  List<UserRecord> findHourMonth(@Param("userClockDTO") UserClockDTO clockDTO);

  /**
   * @Description: 根据条件，分页(不分页)查询人员考勤信息
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
    IPage<UserRecordDTO> findRecordByPage(Page page, @Param("userClockDTO")UserClockDTO clockDTO);
}
